﻿Shader "ShaderToy/SimpleCircle" // ShaderToy风格的测试着色器
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {} // 主纹理输入，默认为白色
	}
	SubShader
	{
		// 关闭剔除，这样可以渲染双面
		Cull Off
		// 禁用深度写入
		ZWrite Off
		// 始终通过深度测试，确保shader总是被渲染
		ZTest Always

		Pass
		{
			CGPROGRAM
			#pragma vertex vert   // 定义顶点着色器
			#pragma fragment frag // 定义片元着色器
			ENDCG

			CGINCLUDE      
		 	
			#include "UnityCG.cginc"     // 包含Unity的常用函数和变量
			#pragma target 3.0            // 设置shader目标版本为3.0
			// 定义常用的ShaderToy变量，使其与Unity对应
			// 屏幕的尺寸
			#define iResolution _ScreenParams
			// 屏幕中的坐标，以pixel为单位
			#define gl_FragCoord ((_iParam.srcPos.xy/_iParam.srcPos.w)*_ScreenParams.xy)
			
			// 顶点着色器输入结构体
			struct appdata
			{
				float4 vertex : POSITION;      // 顶点位置
				float2 uv : TEXCOORD0;         // UV坐标
				float4 srcPos : TEXCOORD1;     // 屏幕空间位置
			};

			// 顶点着色器输出结构体（片元着色器输入结构体）
			struct v2f
			{
				float2 uv : TEXCOORD0;         // UV坐标
				float4 vertex : SV_POSITION;    // 裁剪空间位置
				float4 srcPos : TEXCOORD1;     // 屏幕空间位置
			};

			// 顶点着色器函数
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);  // 将顶点从模型空间转换到裁剪空间
				o.uv = v.uv;                               // 传递UV坐标
				o.srcPos = ComputeScreenPos(o.vertex);     // 计算屏幕空间位置
				return o;
			}
			
			sampler2D _MainTex;  // 主纹理采样器
			
			// 片元着色器函数
			float4 frag (v2f _iParam) : COLOR
			{   
				// 当前返回纯白色
				return float4(1,1,1,1);
			}					
			ENDCG										
		}
	}
}